//---------------------------------------------------------------------------

#include <vcl.h>
#include "Eic.h"
#pragma hdrstop

#include <stdio.h> //Pour sprintf
#include "MTAG_EIC.h"
#include "uDates.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#define MODULE_TAG MTAG_UDATES

short shSeuilAnnees2000 = DATE_MAX_ANNEES2000;

typedef struct
   {
   unsigned    ft_tsec  : 5;   /* Two second interval */
   unsigned    ft_min   : 6;   /* Minutes */
   unsigned    ft_hour  : 5;   /* Hours */
   }sffTime;

typedef struct
   {
   unsigned    ft_day   : 5;   /* Days */
   unsigned    ft_month : 4;   /* Months */
   unsigned    ft_year  : 7;   /* Year */
   }sffDate;

union sfTime
     {
   sffTime t;
   unsigned short uhTime;
   };

union sfDate
     {
   sffDate d;
   unsigned short uhDate;
   };


////////////////////////////////////////////////////////////////////////////////
//                                                                            //
// Convertit une annee sur 4 Digits en AnsiString de 2 Digits                 //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////
AnsiString __fastcall An4DToAnsiString2D( short int shiAnnee )
{
   short int shiAn2D = (short int)(shiAnnee % 100);
   return((shiAn2D < 10)? (AnsiString("0") + AnsiString(shiAn2D)) : (AnsiString(shiAn2D)));
   }


/*******************************************************************************

Fonction :

P.E :

P.E modifiés :

P.S :
*******************************************************************************/
AnsiString __fastcall sDateToAnsiString(const sDate &d)
{
char szTemp[11] = "";

try
   {
   if(d.j == 0)
      strcpy(szTemp, "");
   else
      sprintf(szTemp, "%02d/%02d/%04d", d.j, d.m, d.a);
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(20), e);
   }
return AnsiString(szTemp);
}

/*******************************************************************************
sDate __fastcall TDateTimeTosDate(TDateTime    TDate);

Fonction : Convertit un TDateTime en structure sDate

P.E : TDate : Date source

P.S : Date convertie au format sDate
*******************************************************************************/
sDate __fastcall TDateTimeTosDate(const TDateTime &TDate)
{
sDate Date;
unsigned short a;
unsigned short m;
unsigned short j;

try
   {
   if((double)TDate == (double)0 )
      {
      Date.a = (short)0;
      Date.m = (char)0;
      Date.j = (char)0;
      }
   else
      {
      TDate.DecodeDate(&a, &m, &j );
      Date.a = (short)a;
      Date.m = (char)m;
      Date.j = (char)j;
      }
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(30), e);
   }
return(Date);
}

/*******************************************************************************
Prototype : TDateTime __fastcall sDateToTDateTime(sDate Date);

Fonction : Convertit un TDateTime en structure sDate

P.E : Date : Date à convertir

P.S : Date convertie en TDateTime
      Retourne 0 si erreur
*******************************************************************************/
TDateTime __fastcall sDateToTDateTime(const sDate &Date)
{
TDateTime TDDateConvertie;

try
   {
   if( Date.a > 1899 && Date.a <= 2060 )
      {
      try
         {
         TDDateConvertie = TDateTime( Date.a, Date.m, Date.j );
         return(TDDateConvertie);
         }

      catch( EConvertError &e )
         {
         return( 0 );
         }
      }
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(40), e);
   }
return 0;
}


/*******************************************************************************

Fonction :

P.E :

P.E modifiés :

P.S :
*******************************************************************************/
sDate __fastcall AnsiStringTosDate(const AnsiString &aDate)
{
sDate Date;

try
   {
   if (aDate.IsEmpty())
      SET_DATE_TO_VIDE(&Date);
   else
      {
      int j, m, a;
      sscanf(aDate.c_str(), "%d/%d/%d", &j, &m, &a);

      Date.j = j;
      Date.m = m;
      Date.a = a;
      }
   }
catch(Exception &e)
   {
   EICDisplayException(TAG(50), e);
   }
return Date;
}

////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//                                                                            //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////
AnsiString __fastcall MakeTime( unsigned short uhTime )
   {
   sfTime st;
   char szTemp[ 6 ] = "";
   AnsiString aTime;

   st.uhTime = uhTime;

   sprintf( szTemp,"%02d:%02d", st.t.ft_hour, st.t.ft_min );

   return( aTime = szTemp );
   }




////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//                                                                            //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////
AnsiString __fastcall MakeDate( unsigned short uhDate )
   {
   sfDate sd;
   char szTemp[ 6 ] = "";
   AnsiString aDate;
   int iAnnee;

   sd.uhDate = uhDate;

   if(( iAnnee = sd.d.ft_year ) < 20 ) iAnnee += 80;
   else iAnnee -= 20;
   sprintf( szTemp,"%02d/%02d/%02d", sd.d.ft_day, sd.d.ft_month, iAnnee );

   return( aDate = szTemp );
   }


/*************************************************
* Retourne le dernier jour d'un mois en tenant   *
* compte des années bissextiles.                 *
*************************************************/
char DernierJourMois(const sDate &Date)
{
  char tab[12] = {31,28,31,30,31,30,31,31,30,31,30,31},DernierJour = tab[Date.m - 1];
  if ((Date.m == (char)2) && IsBissextile(Date.a))
    DernierJour++;
  return DernierJour;
}


/**************************************
* Vérifie si une année est bissextile *
**************************************/
int IsBissextile(short Annee)
{
  return (Annee % 4 == 0) && (Annee % 100 != 0) || (Annee % 400 == 0);
}

